sql 태그를 사용하기 위해서 페이지 상단에 다음과 같이 선언되어야 된다.
<%@ taglib uri="http://java.sun.com/jstl/sql" prefix="sql"%>
DataSource 를 이용해서 SQL을 처리하는 sql 태그는 다음과 같은 것들이 있다.
| 기능 | 태그 | prefix |
|---|---|---|
| DataSource 설정 | SetDataSource | sql |
| SQL | query (dateParam, param) , update (dateParam, param) , transaction | sql |
javax.sql.DataSource의 인스턴스를 얻을 수 있다.
| <sql:setDataSource {dataSource="dataSource" \ | url="jdbcUrl" [WEBSTUDY:driver="driverClassName"] [WEBSTUDY:user="userName"] [WEBSTUDY:password="password"]} [WEBSTUDY:var="varName"] [scope="{page\ | WEBSTUDY:request|session|application}"]/> |
쿼리 실행.
JDBC의 java.sql.PreparedStatement 인터페이스에 기반한 방식을 사용하여 매개변수화 된다.
매개변수 값은 중첩된 <sql:param>과 <sql:dateParam> 태그를 사용하여 지정된다.
<%@ page pageEncoding="MS949" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<fmt:setLocale value="ko" />
<sql:query var="emp"
dataSource="jdbc/myora81">
SELECT EMPNO AS 사원번호, ENAME AS 이름,
SAL AS 월급여, HIREDATE AS 입사일
FROM EMP
</sql:query>
<table border="1">
<tr>
<%-- 필드의 정보를 출력한다. --%>
<c:forEach var="columnName" items="${emp.columnNames}">
<th><c:out value="${columnName}"/></th>
</c:forEach>
<%-- 데이터를 한 줄씩 출력한다. --%>
<c:forEach var="row" items="${emp.rowsByIndex}">
<tr>
<%-- 필드의 길이만큼 반복한다. --%>
<c:forEach var="column" items="${row}" varStatus="i">
<c:choose>
<c:when test="${i.index==3}">
<td><fmt:formatDate value="$" pattern="yyyy/MM/dd"/></td>
</c:when>
<c:otherwise>
<td><c:out value="$"/></td>
</c:otherwise>
</c:choose>
</c:forEach>
</c:forEach>
</table>
<hr>
<table border="1">
<c:forEach var="row" items="${emp.rows}">
<tr>
<td>번호: <c:out value="${row['사원번호']}"/></td>
<td>이름: <c:out value="${row['이름']}"/></td>
</tr>
</c:forEach>
</table>
<sql:dateParam/>은 java.sql.PreparedStatement.setTimestamp() 역할을 하고,
<sql:param/> 은 java.sql.PreparedStatement.setString() 의 역할을 한다.
| <sql:dateParam value="value" type="[timestamp|WEBSTUDY:time|date]"/> |
| <sql:param value="value"/> |
java.sql.Statement.executeUpdate() 메소드에 해당.
형식과 동작은 <sql:query/>태그와 동일.
| <sql:update sql="sqlUpdate" [WEBSTUDY:dataSource="dataSource"] [WEBSTUDY:var="varName"] [scope="{page\ | WEBSTUDY:request|session|application}"]/> |
<html>
<body>
<sql:setDataSource var="dataSrc"
url="jdbc:oracle:thin:@localhost:1521:ORCL" driver="oracle.jdbc.OracleDriver"
user="scott" password="tiger"/>
<sql:transaction dataSource="${dataSrc}">
<sql:update sql="insert into dept(deptno, dname, loc) values(?,?,?)">
<sql:param value="50"/>
<sql:param value="DEVS"/>
<sql:param value="SEOUL"/>
</sql:update>
<sql:update sql="update dept set LOC=? where deptno=?">
<sql:param value="BUSAN"/>
<sql:param value="50"/>
</sql:update>
</sql:transaction>
</body>
</html>
트랜잭션 구현.
(트랜잭션은 하나의 작업 그룹으로서 성공 또는 실패 시에 데이타베이스 연산 결과를 보호하는데 사용)
| <sql:transaction [WEBSTUDY:dataSource="dataSource"] [WEBSTUDY:isolation=isolationLevel]> <sql:query> 과 <sql:update> 문들 </sql:transaction> |
isolationLevel ::= "read_committed"| "read_uncommitted"| "repeatable_read"| "serializable"